Computer systems go through a boot phase when they are turned on that prepares the computer for use and turns over control of the hardware to the operating system. Generally, the hardware includes some firmware that initializes the hardware, such as Basic Input/Output System (BIOS) and Extended Firmware Interface (EFI). This firmware then generally looks to a disk drive to identify a master boot record (MBR) or other first set of instructions to run. These instructions may invoke a boot loader, which then loads and initializes the operating system (or potentially offers a menu of operating systems from which to boot the computer system). Similarly, once the operating system is loaded applications also go through an initialization phase, during which software and data modules associated with the application are loaded, memory state is initialized (e.g., with resources or other data), and so forth.
These boot and initialization processes are often time consuming. Not only can sophisticated hardware take time to initialize and reach an operational state, but software takes time to load from disk and time to run to carry out various initialization tasks. The user of the computer system cannot use the system or application until this process is complete, and thus time is wasted. In addition, during other periods such as waking a computer from a sleep state, low-power state, or hibernation the system may perform a similar boot-like process that delays the user's use of the computer system. For mobile devices, game consoles, routers, and other devices that are internally implemented as computer systems even though consumers may view them as integrated consumer electronics, the time to boot can significantly detract from the availability of the device.
In standard operating systems, constant code that is rarely updated such as the kernel is read from legacy drives in the same way as user application code. This leads to less than optimal boot times, as the operating system brings itself into an operating state via a complex load sequence from hard drive or other relatively slow resources. Even with modern flash-based disk drives, the number of reads and writes to load software code and set initial configuration can consume a noticeable amount of time for the user. The same is true of applications, which may involve accessing and loading dozens of libraries, and subsequently initializing memory areas specified by the libraries with data. A large portion of this data is constant data that is the same each time the operating system or application loads. Past techniques have focused on ways to rearrange this data on existing, non-byte-addressable hard drives, which still involves noticeable delay, or on performing the normal initialization sequence early before an application is requested by the user (see, e.g., MICROSOFT™ WINDOWS™ Prefetch and SuperFetch features).